/* 
 * File:   Lista.cpp
 * Author: Pedro
 * 
 * Created on 13 de Agosto de 2010, 15:26
 */

#include "../Classe/Lista.h"
#include <stdlib.h>
#include <iostream>

using namespace std;

Lista::Lista() {
    this->primeiro = NULL;
    this->ultimo = NULL;
    this->numElementos = 0;
}

Lista::Lista(const Lista& orig) {
}

Lista::~Lista() {
}

void Lista::Insere(Campo valor) {

    NoLista *aux = new NoLista;
    aux->valor = valor;
    aux->Proximo = NULL;

    if (this->numElementos == 0) {
        this->primeiro = aux;
        this->ultimo = aux;
    } else {
        this->ultimo->Proximo = aux;
        this->ultimo = aux;
    }

    this->numElementos += 1;
}

void Lista::ExibeLista(){

    NoLista *ponteiro = this->primeiro;

    while(ponteiro!=NULL){

        cout << ponteiro->valor.identificador << "|" << ponteiro->valor.lexema << "|" << ponteiro->valor.token << "->";
        ponteiro = ponteiro->Proximo;
        
    }

}

void Lista::RemoveLista(Campo valor){

    NoLista *ponteiro = this->primeiro;
    NoLista *sai;
    sai = NULL;
    while(ponteiro!=NULL){

        if(ponteiro->valor==valor){
           sai = ponteiro;
           this->primeiro = ponteiro->Proximo;
           break;
        }else if(ponteiro->Proximo != NULL && ponteiro->Proximo->valor==valor){

            sai = ponteiro->Proximo;
            ponteiro->Proximo = ponteiro->Proximo->Proximo;

            if(ponteiro->Proximo==NULL)
                this->ultimo = ponteiro;
            
            break;
        }


        ponteiro = ponteiro->Proximo;
    }
    if(sai!=NULL){
        delete(sai);
        this->numElementos = this->numElementos - 1;
    }


}

void Lista::operator<< (Campo valor){

    this->Insere(valor);

}

void Lista::operator>> (Campo valor){
    this->RemoveLista(valor);
}

Campo* Lista::procuraPor(int token){

    Campo *retorno = NULL;
    NoLista *ponteiro = this->primeiro;

    while(ponteiro!=NULL){

        if(ponteiro->valor.token == token){

            retorno = new Campo();
            *retorno = ponteiro->valor;
            return retorno;
        }
         ponteiro = ponteiro->Proximo;

    }
    return NULL;

}

Campo* Lista::procuraPor(string lexema){

    Campo *retorno = NULL;
    NoLista *ponteiro;
    ponteiro = this->primeiro;

    while(ponteiro!=NULL){

        if(ponteiro->valor.lexema == lexema){

            retorno = new Campo();
            *retorno = ponteiro->valor;
            return retorno;
        }
         ponteiro = ponteiro->Proximo;

    }
    return NULL;

}
bool Lista::existeNaLista(int token){

    return (this->procuraPor(token)!=NULL);

}
bool Lista::existeNaLista(string lexema){

    return (this->procuraPor(lexema)!=NULL);

    }
